import { getVectorStore } from '../knowledgeBase/vectorStore'
import { contextDescriptionsToString } from './caseContextDescriptionKeys'
import { IReqData, IMessage } from './interfaces'

// 根据前端请求获取messages数组，案例问答时使用
export const getMessagesForCase = async (data: IReqData) => {
    const { user, context, knowledgeBase, enableKnowledgeBase } = data

    const messages: IMessage[] = []

    // 如果不是数组，那么就是用户提问了，否则表示用户回答了题目，会有题目和用户的答案两项内容
    if (!data.messages?.length) {
        messages.push({
            type: 'system',
            content: `#  Role: 教学案例AI小助手

            ## Goals
            根据当前案例解答用户的问题，帮助用户更好的理解教学案例。
            
            ## Constrains
            不需要推理过程，回答的时候不要提供额外的信息。输出简单简洁简短的回答。
            
            ## Skills
            文本解析、信息提取
            
            ## Workflow:
            1. 如果用户询问跟案例无关的问题，则直接给出答案，忽略案例相关信息。
            2. 如用户询问跟案例相关的问题，则根据案例相关信息给出答案。`,
        })
        const constextStr = contextDescriptionsToString(context)
        const systemCtxContent = constextStr
            ? `三个单引号中间的文本是关于当前案例的信息：\n'''\n${constextStr}\n'''`
            : ''
        messages.push({
            type: 'system',
            content: `${systemCtxContent}`,
        })
    } else {
        messages.push({
            type: 'system',
            content: `#  Role: 判题助手

            ## Goals
            判断用户是否回答正确。
            
            ## Constrains
            不需要推理过程，回答的时候不要提供额外的信息。输出简单简洁简短的回答。
            
            ## Workflow:
            1. 如果用户回答正确，则输出回答正确，并鼓励用户继续加油。
            2. 如果用户回答错误，则输出回答错误，并鼓励用户，不需要给出正确答案。`,
        })
        messages.push(...data.messages)
    }

    if (knowledgeBase && enableKnowledgeBase) {
        const { collectionName } = knowledgeBase
        const collection = await getVectorStore(collectionName)
        const doc = await collection.similaritySearch(user, 1)
        // console.log('doc---------')
        // console.log(doc)
        messages.push({
            type: 'system',
            content: `根据下面的信息回答用户的问题：
'''
${doc[0].pageContent}
'''
`,
        })
    }

    messages.push({ type: 'user', content: user })

    return messages
}
// 文章润色时使用
export const getMessagesForWriting = (data: IReqData) => {
    const { user, context } = data

    const messages: IMessage[] = [
        {
            type: 'system',
            content: `你是一个专业的写作助手，能够帮助用户完成写作任务。
            当用户提出写作主题和要求时，你要先分析主题的关键要素。然后按照合理的结构框架，为用户逐步生成内容思路，提供丰富且恰当的词汇、语句建议，协助用户将想法流畅地转化为高质量的文字作品。`,
        },
        { type: 'user', content: user },
    ]
    return messages
}

// 知识点生成
export const getMessagesForQuestionPoint = (data: IReqData) => {
    const { user, context } = data

    const messages: IMessage[] = [
        {
            type: 'system',
            content: `你是一个知识点生成器，根据教学案例标题和触发时机生成一个适合该触发时机的知识点，以便后续根据该知识点生成题目。
输出格式：只需要输出知识点，20个字以内。

例如：
案例标题：冒泡排序 触发时机：SWAP 触发时机名称：元素发生交换
输出：冒泡排序中，当相邻元素顺序不符合排序要求会发生元素交换操作。

案例标题：冒泡排序 触发时机：ROUND_START 触发时机名称：元素发生交换
输出：冒泡排序每一轮比较，其主要目的是为了把当前轮次最大（最小）的元素移动到合适位置。

案例标题：冒泡排序 触发时机：SORT_START 触发时机名称：元素发生交换
输出：冒泡排序刚开始时，待排序的元素处于随机无序的状态。
`,
        },
        { type: 'user', content: user },
    ]
    return messages
}

// 题目生成
export const getMessagesForQuestion = (data: IReqData) => {
    const { user, context } = data

    const messages: IMessage[] = [
        {
            type: 'system',
            content: `你是一个单选题生成器，根据教学案例标题和知识点生成一个单选题和答案。
输出格式：以json格式输出，包含问题内容，选项列表，答案等三个字段。

例如：
案例标题：冒泡排序
知识点：在冒泡排序中，当相邻元素顺序不符合排序要求会发生元素交换操作。

输出：
{
   "content": "在冒泡排序中，什么情况下会发生元素交换操作呢？",
   "options": [
        { "id": "A", "content": "只要两个相邻元素不相等就交换"},
        { "id": "B", "content": "当相邻元素顺序不符合排序要求（比如从小到大排序时前一个元素大于后一个元素）时交换"},
        { "id": "C", "content": "随机决定是否交换相邻元素"}
   ],
   "answer": "C"
}
`,
        },
        { type: 'user', content: user },
    ]
    return messages
}
